home *** CD-ROM | disk | FTP | other *** search
- /**
- GRAB Graph Layout and Browser System
-
- Copyright (c) 1986, 1988 Regents of the University of California
- Copyright (c) 1989, Tera Computer Company
- **/
-
- /* routines.c -- routines for menu items. */
-
- #include "malloc.h"
- #include <stdio.h>
- #include <pwd.h>
- #include <strings.h>
-
- #include "attribute.h"
- #include "digraph.h"
- #include "screen.h"
- #include "globals.h"
- #include "scrdep.h"
- #include "interf.h"
- #include "tedge.h"
- #include "cursor.h"
-
- void DoGraph();
- OUTEDGE* get_edge();
- BOOL ReadIn();
-
- /* lots of "turn on/off an option" routines */
- void DoShowBC()
- {
- if (showbc)
- {
- showbc = FALSE;
- IChangeStatusLine("Show BC OFF", FALSE);
- IChangeBC();
- }
- else
- {
- showbc = TRUE;
- IChangeStatusLine("Show BC ON", FALSE);
- IChangeBC();
- }
-
- AsteriskOnToggles();
- }
-
- void DoStraighten()
- {
- if (straightenEdges)
- {
- IChangeStatusLine("Straighten Edges OFF", FALSE);
- }
- else
- {
- IChangeStatusLine("Straighten Edges ON", FALSE);
- }
-
- straightenEdges = !straightenEdges;
- AsteriskOnToggles();
- }
-
- void DoDebugMode()
- {
- if (debug)
- {
- IChangeStatusLine("Debug Mode OFF", FALSE);
- }
- else
- {
- IChangeStatusLine("Debug Mode ON", FALSE);
- }
-
- debug = !debug;
- AsteriskOnToggles();
- }
-
- void DoPrintLabel()
- {
- if (!printNodeLabel)
- {
- printNodeLabel = TRUE;
- IForceNL();
- IChangeStatusLine("Print Node Label Mode is ON", FALSE);
- }
- else
- {
- printNodeLabel = FALSE;
- INoForceNL();
- IChangeStatusLine("Print Node Label Mode is OFF", FALSE);
- }
-
- IChangeForceNL();
- AsteriskOnToggles();
- }
-
- void DoChangeOutEdges()
- {
- if (!changeOutEdges)
- {
- changeOutEdges = TRUE;
- IChangeStatusLine("Change Out Edges ON", FALSE);
- }
- else
- {
- changeOutEdges = FALSE;
- IChangeStatusLine("Change Out Edges OFF", FALSE);
- }
-
- AsteriskOnToggles();
- }
-
- void DoChangeInEdges()
- {
- if (!changeInEdges)
- {
- changeInEdges = TRUE;
- IChangeStatusLine("Change In Edges ON", FALSE);
- }
- else
- {
- changeInEdges = FALSE;
- IChangeStatusLine("Change In Edges OFF", FALSE);
- }
-
- AsteriskOnToggles();
- }
-
- void DoMarkDummyNodes()
- {
- if (markDummyNodes)
- {
- markDummyNodes = FALSE;
- IChangeStatusLine("Mark Dummy Nodes OFF", FALSE);
- }
- else
- {
- markDummyNodes = TRUE;
- IChangeStatusLine("Mark Dummy Nodes ON", FALSE);
- }
-
- IChangeMarkDummy();
- AsteriskOnToggles();
- }
-
- void DoDrawArrow()
- {
- if (printArrow)
- {
- printArrow = FALSE;
- IChangeStatusLine("Draw Arrows OFF", FALSE);
- }
- else
- {
- printArrow = TRUE;
- IChangeStatusLine("Draw Arrow ON", FALSE);
- }
-
- IChangePA();
- AsteriskOnToggles();
- }
-
- void DoRotatePSFile()
- {
- if (landscapePSFile)
- {
- landscapePSFile = FALSE;
- IChangeStatusLine("Rotate PostScript File OFF", FALSE);
- }
- else
- {
- landscapePSFile = TRUE;
- IChangeStatusLine("Rotate PostScript File ON", FALSE);
- }
-
- AsteriskOnToggles();
- }
-
- void DoPrintEdgeLabel()
- {
- if (printEdgeLabel)
- {
- printEdgeLabel = FALSE;
- INoForceEL();
- IChangeStatusLine("Print Edge Label OFF", FALSE);
- }
- else
- {
- printEdgeLabel = TRUE;
- IForceEL();
- IChangeStatusLine("Print Edge Label ON", FALSE);
- }
-
- IChangeForceEL();
- AsteriskOnToggles();
- }
-
- void DoIgnoreHidden()
- {
- if (ignoreHidden)
- {
- ignoreHidden = FALSE;
- IChangeStatusLine("Ignore Hidden OFF", FALSE);
- }
- else
- {
- ignoreHidden = TRUE;
- IChangeStatusLine("Ignore Hidden ON", FALSE);
- }
-
- AsteriskOnToggles();
- }
-
- AsteriskOnToggles()
- /**
- Mark toggles of options menu with asterisk if toggle is on.
- For some reason, passing boolean arrays doesn't work, so we
- use character arrays
- **/
- {
- char optarr[NUMOPTS];
-
- optarr[0] = (char) printNodeLabel;
- optarr[1] = (char) markDummyNodes;
- optarr[2] = (char) printArrow;
- optarr[3] = (char) printEdgeLabel;
- optarr[4] = (char) changeInEdges;
- optarr[5] = (char) changeOutEdges;
- optarr[6] = (char) landscapePSFile;
- optarr[7] = (char) showbc;
- optarr[8] = (char) debug;
- optarr[9] = (char) straightenEdges;
- optarr[10] = (char) ignoreHidden;
- IChangeToggles(optarr);
- }
-
- /**
- routines the C++ routines can call to get the state of the world
- **/
-
- BOOL GetOutEFlag()
- {
- return (changeOutEdges);
- }
-
- BOOL GetInEFlag()
- {
- return (changeInEdges);
- }
-
- BOOL GetBModeFlag()
- {
- return (currMode == IN_BROWSE_MODE);
- }
-
- BOOL GetEModeFlag()
- {
- return (currMode == IN_EDIT_MODE);
- }
-
- BOOL GetCModeFlag()
- {
- return (currMode == IN_CHANGE_MODE);
- }
-
- BOOL GetMarkDummyFlag()
- {
- return markDummyNodes;
- }
-
- void DoBrowseMode()
- {
- currMode = IN_BROWSE_MODE;
- }
-
- void DoChangeMode()
- {
- currMode = IN_CHANGE_MODE;
- }
-
- void DoEditMode()
- {
- currMode = IN_EDIT_MODE;
- }
-
- BOOL GetPAFlag()
- {
- return printArrow;
- }
-
- BOOL GetBCFlag()
- {
- return showbc;
- }
-
- /**
- Other routines
- **/
-
- void DoRedisplay()
- {
- IRedrawWorld();
- }
-
- void DoLayoutGraph()
- {
- if (digraph == NULL)
- {
- IChangeStatusLine("no graph to lay out", FALSE);
- return;
- }
-
- IChangeStatusLine("Laying out graph", TRUE);
- ISetCursor(waitC);
- relay_digraph(digraph);
- StartDisp();
- IUnsetCursor();
- IChangeStatusLine("Graph layout done", FALSE);
- }
-
- static char newName[MAXSTR]; /* new file name */
- int EndDoChangeFileName();
-
- void DoChangeFileName()
- {
- IChangeStatusLine("Type new file name", FALSE);
-
- TakeTextInput(EndDoChangeFileName);
- }
-
- #define BAD 0
- #define OK 1
-
- EndDoChangeFileName()
- {
- int status = OK;
- char *buf;
-
- OutofText(newName);
-
- if (newName[0] != '\0') /* if user entered a name */
- {
- if (newName[0] == '~')
- {
- status = expand_tilde(newName, name);
- }
-
- if (status == BAD || newName[0] != '~')
- {
- strcpy(name, newName); /* copy name of file to global var */
- }
- }
-
- buf = (char *) malloc(sizeof(char) * MAXSTR);
-
- if (newName[0] == '\0')
- {
- sprintf(buf, "old file name retained");
- }
- else if (status == OK)
- {
- sprintf(buf, "new file name is %s", name);
- }
- else
- {
- sprintf(buf, "bad file name: \"%s\"", name);
- }
-
- IChangeStatusLine(buf, FALSE);
- IChangeFileName(name);
- dispose(buf);
- }
-
- expand_tilde(s, name)
- char *s, *name;
- {
- register int i;
- struct passwd *pw;
- char userName[MAXSTR];
-
- s++; /* skip the ~ */
-
- if (*s == '/') /* file name of form ~/foo */
- {
- pw = getpwuid(getuid());
- }
- else /* file name of form ~user/foo */
- {
- i = 0;
-
- while (*s != '/' && *s && i < MAXSTR)
- {
- userName[i++] = *s++;
- }
-
- userName[i] = '\0';
-
- if ((pw = getpwnam(userName)) == 0)
- {
- return BAD;
- }
- }
-
- strcpy(name, pw->pw_dir);
- strncat(name, s, MAXSTR-strlen(name));
- return OK;
- }
-
- void DoReadFile()
- {
- /* free old data structure, get rid of old graph */
- dispose_digraph(digraph);
-
- /* read in the file, layout the graph, and draw it on the screen */
- (void) ReadIn();
- DisplayReadGraph();
- }
-
- void DoWriteFile()
- {
- char* s[MAXSTR];
- FILE *graph_file;
-
- if ((graph_file = fopen(name, "r")) != NULL)
- {
- fclose(graph_file);
- sprintf(s, "File %s exists. Overwrite?", name);
-
- if (IConfirm(s) == 'y')
- {
- write_out();
- }
- }
- else
- {
- write_out();
- }
- }
-
- void DoCreatePSFile()
- {
- ISetCursor(waitC);
- IChangeStatusLine("Creating postscript file of graph", TRUE);
- DrawGraphPS(digraph, showbc);
- IUnsetCursor();
- }
-
- void DoPSScreen()
- {
- ISetCursor(waitC);
- IChangeStatusLine("Creating postscript file of screen", TRUE);
- DrawScreenPS(digraph, showbc);
- IUnsetCursor();
- }
-
- int EndSetZoomGrad(), EndSetPanGrad();
- char gradString[MAXSTR];
-
- void DoSetZoomGrad()
- {
- char *buf;
-
- buf = (char *) malloc(sizeof(char) * MAXLINE);
- sprintf(buf, "Type in new zoom gradient (current zoom gradient = %1.2f)",
- zoomGradient);
- IChangeStatusLine(buf, FALSE);
-
- TakeTextInput(EndSetZoomGrad);
- dispose(buf);
- }
-
- EndSetZoomGrad()
- {
- char *buf;
-
- buf = (char *) malloc(sizeof(char) * MAXLINE);
- OutofText(gradString);
- sscanf(gradString, "%f", &zoomGradient);
- sprintf(buf, "new zoom gradient is %1.2f", zoomGradient);
- IChangeStatusLine(buf, FALSE);
- IChangeZGrad(zoomGradient);
- dispose(buf);
- }
-
- void DoSetPanGrad()
- {
- char *buf;
-
- buf = (char *) malloc(sizeof(char) * MAXLINE);
- sprintf(buf, "Type in new pan gradient (current pan gradient = %1.2f)",
- panGradient);
- IChangeStatusLine(buf, FALSE);
-
- TakeTextInput(EndSetPanGrad);
- dispose(buf);
- }
-
- EndSetPanGrad()
- {
- char *buf;
- int a, b, c, d, e, f, width, height;
-
- buf = (char *) malloc(sizeof(char) * MAXLINE);
- OutofText(gradString);
- sscanf(gradString, "%f", &panGradient);
- sprintf(buf, "new pan gradient is %1.2f", panGradient);
- IChangeStatusLine(buf, FALSE);
- IGetBounds(&a, &b, &c, &d, &e, &f, &width, &height);
- IChangePGrad((int) (panGradient * width), (int) (panGradient * height));
- dispose(buf);
- }
-
-
- void DoSizeToFit()
- {
- IChangeStatusLine("Sizing to Fit", TRUE);
- ICenterGraph();
- DoGraph();
- }
-
- void DoShowSize()
- {
- int x0, y0, width, height, curx, cury, curwidth, curheight;
-
- IGetBounds(&x0, &y0, &width, &height, &curx, &cury, &curwidth, &curheight);
- printf("\nXgrab\n");
- printf("Display x0: %d, y0: %d, width: %d, height: %d\n",
- x0, y0, width, height);
-
- printf("Canvas x0: %d, y0: %d, width: %d, height: %d\n",
- curx, cury, curwidth, curheight);
-
- printf("screen minx: %d, miny: %d, maxx: %d, maxy:%d\n",
- screen.canvas.min_x, screen.canvas.min_y,
- screen.canvas.max_x, screen.canvas.max_y);
-
- /*
- printf("bounding box minx: %d, miny: %d, maxx: %d, maxy:%d\n",
- screen.bound.min_x, screen.bound.min_y,
- screen.bound.max_x, screen.bound.max_y);
- */
-
- printf("Absolute minx: %d, miny: %d, maxx: %d, maxy:%d\n",
- screen.absview.min_x, screen.absview.min_y,
- screen.absview.max_x, screen.absview.max_y);
- }
-
- void DoFocusNode()
- {
- inFocusNodeMode = TRUE;
- IChangeStatusLine("select a node", FALSE);
- }
-
- void DoChangeText()
- {
- inChangeTextMode = TRUE;
- IChangeStatusLine("select a node", FALSE);
- }
-
- static char newNodeName[MAXSTR];
- static NODE *changeTextNode;
- int EndChangeNodeText();
-
- DoChangeNodeText()
- {
- NODE *node;
- node = (NODE *) ICurNode();
-
- changeTextNode = node;
-
- IChangeStatusLine("Type new node name", FALSE);
- TakeTextInput(EndChangeNodeText);
- }
-
- EndChangeNodeText()
- {
- char *s;
- int nameLen;
- char *buf;
-
- buf = (char *) malloc(sizeof(char) * MAXLINE);
- OutofText(newNodeName);
-
- nameLen = strlen(newNodeName);
- s = (char *) malloc(nameLen+1 * sizeof(char));
- strcpy(s, newNodeName);
-
- sprintf(buf, "new node name is %s", s);
- IChangeStatusLine(buf, FALSE);
-
- Text(changeTextNode) = s;
- IChangeNodeText(s);
- graphChanged = TRUE;
- ckpt_done = FALSE;
- dispose(buf);
- }
-
- void DoChangeEdgeLabel()
- {
- inChangeEdgeLabelMode = TRUE;
- IChangeStatusLine("select an edge", FALSE);
- }
-
- static char newLabel[MAXSTR];
- static NODE *fromNode, *toNode, *nextnode;
- static int ord;
- int EndChangeEdgeLabel();
-
- extern NODE *get_prev_node();
- extern NODE *get_next_node();
-
- DoChangeEdgeText()
- {
- TEDGE* tedge;
- VNO to_vno;
-
- tedge = (TEDGE *) ICurEdge();
-
- fromNode = (NODE *) tedge->fromnode;
- toNode = (NODE *) tedge->tonode;
- ord = tedge->ord;
-
- if (Is_dummy(fromNode) || Is_dummy(toNode))
- {
- if (Is_dummy(fromNode))
- {
- fromNode = get_prev_node(digraph, fromNode);
- }
-
- if (Is_dummy(toNode))
- {
- toNode = get_next_node(digraph, toNode);
- }
-
- each_element(Succ_set(fromNode), to_vno)
- loop
- if (Is_dummy(Node(digraph, to_vno)) &&
- get_next_node(digraph, Node(digraph, to_vno)) == toNode)
- {
- nextnode = Node(digraph, to_vno);
- break;
- }
- endloop;
- }
- else
- {
- nextnode = toNode;
- }
-
- IChangeStatusLine("Type new edge label", FALSE);
- TakeTextInput(EndChangeEdgeLabel);
- }
-
- EndChangeEdgeLabel()
- {
- char *s;
- int labelLen;
- OUTEDGE *outedge;
- char *buf;
-
- buf = (char *) malloc(sizeof(char) * MAXSTR);
- OutofText(newLabel);
-
- labelLen = strlen(newLabel);
- s = (char *) malloc(labelLen+1 * sizeof(char));
- strcpy(s, newLabel);
-
- sprintf(buf, "new edge label is %s", s);
- IChangeStatusLine(buf, FALSE);
-
- outedge = get_edge(digraph, fromNode, toNode, ord);
- Label(outedge) = s;
-
- IChangeEdgeLabel(fromNode, nextnode, ord, s);
- graphChanged = TRUE;
- ckpt_done = FALSE;
- dispose(buf);
- }
-
- void DoRedrawGraph()
- {
- DoGraph();
- }
-
- void DoShowLevels()
- {
- int absY;
- LEVEL *level;
- MEMBER *member;
- BOOL inLoop = FALSE;
- int nodeThisLevelY, nodeNextLevelY;
- int x, width;
-
- each_level(digraph, level)
- loop
- inLoop = TRUE;
- break;
- endloop;
-
- if (!inLoop)
- {
- IChangeStatusLine("no level structure", FALSE);
- }
- else
- {
- width = ABSX_TO_SCRX(&screen, screen.absview.max_x);
- x = ABSX_TO_SCRX(&screen, screen.absview.min_x);
-
- each_level(digraph, level)
- loop
- if (Next_level(level) == NULL)
- {
- break;
- }
-
- each_member(level, member)
- loop
- nodeThisLevelY = Y_position(member);
- break;
- endloop
-
- each_member(Next_level(level), member)
- loop
- nodeNextLevelY = Y_position(member);
- break;
- endloop
-
- absY = nodeThisLevelY + ((nodeNextLevelY - nodeThisLevelY) / 2);
- IAddLine(x, (int) ABSY_TO_SCRY(&screen, absY),
- width, (int) ABSY_TO_SCRY(&screen, absY),
- DOTTEDB, BLACK, TRUE);
- endloop
- }
- }
-
- int EndFocusNamedNode();
- extern VNO get_vno();
-
- DoFocusNamedNode()
- {
- IChangeStatusLine("Type name of node", FALSE);
- TakeTextInput(EndFocusNamedNode);
- }
-
- EndFocusNamedNode()
- {
- char nodeName[MAXSTR];
- VNO vno;
- char *buf;
-
- buf = (char *) malloc(sizeof(char) * MAXSTR);
- OutofText(nodeName);
-
- if ((vno = get_vno(digraph, nodeName)) == (VNO) -1)
- {
- sprintf (buf, "No node with name %s", nodeName);
- IChangeStatusLine(buf, FALSE);
- }
- else
- {
- FocusNode(Node(digraph, vno));
- }
-
- dispose(buf);
- }
-
- DoFocusCurNode()
- {
- NODE *node;
-
- node = (NODE *) ICurNode();
- FocusNode(node);
- }
-
- FocusNode(node)
- NODE *node;
- {
- float sizeX, sizeY;
- int wantedX, wantedY;
- float wantedMag;
- int fsizeX, fsizeY;
-
- IChangeStatusLine("Focusing Graph", FALSE);
-
- /* find coordinates that should be the new 'center' of the screen */
- wantedX = (int) ABSX_TO_SCRX(&screen, X_position(node)) +
- screen.display.min_x;
- wantedY = (int) ABSY_TO_SCRY(&screen, Y_position(node)) +
- screen.display.min_y;
-
- /* find magnification needed to see font */
- FindFontSize(digraph, &screen, &sizeX, &sizeY);
- IFindSmallestFont(&fsizeX, &fsizeY);
- wantedMag = MAX (MAX((float) fsizeX / (float) sizeX,
- (float) fsizeY / (float) sizeY), 1.0);
- /* don't shrink it */
-
- IFocusGraph(wantedX, wantedY, wantedMag);
- }
-
- FindFontSize(digraph, screen, sizeX, sizeY)
- DIGRAPH *digraph;
- SCREEN *screen;
- float *sizeX;
- float *sizeY;
- {
- int a, b, c, d, e, f;
- int width, height;
-
- /* find size of font to use */
-
- IGetBounds (&a, &b, &width, &height, &c, &d, &e, &f);
- *sizeX = (float) (HALF_CHAR * 2) * (float) width /
- (float) (screen->absview.max_x - screen->absview.min_x);
- *sizeY = (float) get_height(digraph) * (float) height /
- (float) (screen->absview.max_y - screen->absview.min_y);
- }
-
-
- void DoHelp()
- {
- IPrintHelp();
- }
-
- void DoShowNAttr()
- {
- NODE* node;
-
- node = (NODE *) ICurNode();
- IShowNAttr(node->attributes);
- }
-
- void DoShowEAttr()
- {
- TEDGE* tedge;
- OUTEDGE* e;
-
- tedge = (TEDGE *) ICurEdge();
- e = get_edge(digraph, (NODE *) tedge->fromnode, (NODE *) tedge->tonode,
- tedge->ord);
- IShowEAttr(e->attributes);
- }
-
- void DoEraseAttrBox()
- {
- IEraseAttrBox();
- }
-
- void DoSetDisplayed()
- {
- ISetDisplayed();
- }
-